package com.bird.thread.base.stopthread;

/**
 * @author sijunqiang
 * @data 2021/6/26 9:46
 * @description: run()方法内没有sleep或者wait方法时 停止线程的方法。
 * 结论：停止一个普通的线程
 * 第一,需要对主线程先调用：thread.interrupt()通知那个线程 让它停止继续操作。(还得需要那个线程配合)
 * 第二, 在run()方法里面 先获取当前的线程(Thread.currentThread().isInterrupted) 然后在判断那个状态是否终止。根据这个状态判断是否继续往下执行。
 */
public class RightWayStopThreadWithoutSleep implements Runnable {

    //
    @Override
    public void run() {
        long start = System.currentTimeMillis();
        int num = 0;
        //!Thread.currentThread().isInterrupted() 这个标记需要和外部调用配合 这样的话 才能终止线程。
        boolean interrupted = Thread.currentThread().isInterrupted();
         while (!Thread.currentThread().isInterrupted() && num <= Integer.MAX_VALUE / 2) {
            if (num % 10000 == 0) {
                System.out.println(num + " 是10000的倍数 boolean= " + Thread.currentThread().isInterrupted());
            }
            num++;
        }
        long end = System.currentTimeMillis();
        long time = (end - start);
        System.out.println("任务运行结束了! 耗时：" + time + " ms" + " interrupted= " + interrupted);
    }

    // 普通情况下 使用interrupt 停止线程的方法
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new RightWayStopThreadWithoutSleep());
        thread.start();

        // 开始睡眠-睡眠1s后开始执行中断线程信号。
        Thread.sleep(1000);// 结论：被停止的线程自己拥有主动权。
        boolean interrupted1 = thread.isInterrupted();
        System.out.println("before set interrupt boolean: " + interrupted1);
        thread.interrupt();
        boolean interrupted = thread.isInterrupted();
        System.out.println("after set interrupt boolean  = " + interrupted);

        //总结： 如何需要正确的停止这个话 那么就需要主线程使用interrupt方法 通知那个线程
        // 而且那个需要被停止的线程还得配合 添加一个标记。这样的才能完成停止线程的操作。
    }
}
